//引入插件
import Vue from 'vue'
import VueRouter from 'vue-router'
//引入仓库
import store from '@/store'

//使用插件
Vue.use(VueRouter)

//引入路由
import routes from './routes'
//定义一个路由实例
let router = new VueRouter({
    routes,
    scrollBehavior(to, from, position) {
        //y:0代表滚动条在最上方
        return { y: 0 }
    }
})

//暴露路由前装一个全局守卫--前置守卫（路由跳转前进行判断）
router.beforeEach(async (to, from, next) => {
    let token = store.state.user.token
    let name = store.state.user.userInfo.name

    //用户已经登录
    if (token) {
        //用户想进入login
        if (to.path == '/login' || to.path == '/register') {
            //强制进入home页面
            next('/home')
        } else {
            //如果有用户信息
            if (name) {
                //直接放行
                next()
            } else {
                try {
                    //先获取用户信息
                    await store.dispatch('getUserInfo')
                    //再放行
                    next()
                } catch (error) {
                    //如果token失效,清除仓库token，重新登录
                    await store.dispatch('logout')
                    next('/login')
                }
            }
        }
    } else {
        //用户未登录：不能去交易相关【trade】,支付相关【pay】,个人中心【center】
        let toPath = to.path
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            //保存路由中的地址，登录页后跳转
            next(`/login?redirect=${toPath}`)
        } else {
            //去的不是上面这些路由，放行
            next()
        }
    }
})
//暴露路由
export default router

//先备份VueRouter原型对象的push
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
//重写push|replace
//第一个参数：告诉push方法路由跳转的位置
//第二个参数：返回成功
//第二个参数：返回失败

/* 
call||apply区别
相同点：都可以调用函数一次，都可以篡改函数上下文
不同点：call传递参数用逗号隔开，apply用数组形式传参
*/
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        originPush.call(this, location, resolve, reject)
    } else {
        originPush.call(this, location, () => { }, () => { })
    }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace.call(this, location, () => { }, () => { })
    }
}
